package com.example.demo34permission.controller;

import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

/**
 * 第一个 hello 方法，注解的约束是，只有当前登录用户名为 wangnian 的用户才可以访问该方法。
 * 第二个 admin 方法，表示访问该方法的用户必须具备 admin 角色。
 * 第三个 user 方法，表示方法该方法的用户必须具备 user 角色，但是注意 user 角色需要加上 ROLE_ 前缀。
 * 第四个 getAge 方法，表示访问该方法的 age 参数必须大于 98，否则请求不予通过。
 *
 * 可以看到，这里的表达式还是非常丰富，如果想引用方法的参数，前面加上一个 # 即可，既可以引用基本类型的参数，也可以引用对象参数。
 */
@RestController
public class Hello2Controller {

    // 只有当前登录用户名为 wangnian 的用户才可以访问该方法
    @PreAuthorize("authentication.name.equals('wangnian')")
//    @PreAuthorize("principal.username.equals('wangnian')")
    @GetMapping("/wangnian")
    public String wangnian() {
        return "wangnian";
    }
    // 表示访问该方法的用户必须具备 admin 角色
    @PreAuthorize("hasRole('admin')")
    @GetMapping("/admin/hello2")
    public String admin() {
        return "admin hello2";
    }
    // 表示该方法的用户必须具备 user 角色，但是注意 user 角色需要加上 ROLE_ 前缀,
    // @Secured({"ROLE_user","ROLE_admin"}) 表示有几个即可
    @Secured({"ROLE_user"})
    @GetMapping("/user/hello2")
    public String user() {
        return "user hello2";
    }

    @PreAuthorize("#age>98")
    @GetMapping("/age")
    public String getAge(@RequestParam Integer age) {
        return String.valueOf(age);
    }

}
